package facadePattern

/**
 * 外观模式,也叫门面模式
 *
 * 一个子系统的外部与其内部的通信必须通过一个统一的对象进行,外观模式提供一个高层次的接口,使得子系统更易使用.
 *
 * 优点: 1.减少系统的互相依赖,所有的依赖都是对Facade对象的依赖,与子系统无关.
 *      2.提高灵活性,不管子系统内部如何变化,只要不影响Facade对象,任何活动都是自由的
 *
 * 示例:模拟秘书为老版准备工作的过程.
 *     机场类Airport,酒店类Restaurant,宾馆类Hotel和司机类Chauffeur四个组成一个子系统;
 *     秘书类Secretary是一个外观角色类,对子系统中的四个类进行引用,老版Boss无须知道子系统内的各个类,只通过秘书安排工作即可.
 *
 * 举个栗子:
 * 小A同学是一个很害羞的人,所以每次出门都带着女朋友一块,当出门在外面迷路的时候,小A就不好意思问路,就会对他的女朋友说:"嘿,你去问问路,然后告诉我
 * 怎么走.",看到想买的东西的时候,也会对他的女朋友说:"嘿,你去问问价钱,不贵的话我再买."(对于程序设计而言,一个类对外所依赖的越少,也就可以理解为这个
 * 类越不容易出错(越稳定),但是是不是一个类对外的依赖越少就越好呢?),突然有一天小A同学的前女友过来了,如果小A让他的现任去跟他的前任去接触,事情显然会变得很复杂,
 * 如果他自己去跟他的前任见面,那就要多增加一个依赖关系.小A自己就需要小心翼翼的去维护这样一种微妙的关系.(在编码的时候,很多情况下也会遇到这样的抉择,怎么处理,这是个问题)
 */
fun main() {
    val secretary = Secretary()
    //通知秘书要去出差
    secretary.trip("北京", "上海", 3)

    //打印一个回车,无意义
    println()

    //通知秘书要谈业务
    secretary.repast(3)
}